package com.study.map.dto;

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.study.common.jackson.StringOrArrayDeserializer;
import lombok.Data;
import java.util.List;

/**
 * POI搜索响应DTO
 *
 * @author study
 * @date 2025-08-31
 */
@Data
public class PoiResponse {

    /**
     * 返回状态码
     * 1：成功；0：失败
     */
    private String status;

    /**
     * 返回的状态信息
     */
    private String info;

    /**
     * 返回结果总数
     */
    private Integer count;

    /**
     * 建议结果
     */
    private Suggestion suggestion;

    /**
     * 状态码
     * 10000：请求正常；其他：请求异常
     */
    private String infocode;


    /**
     * POI搜索结果
     */
    private List<Poi> pois;



    /**
     * POI信息
     */
    @Data
    public static class Poi {
        /**
         * POI ID
         */
        private String id;

        /**
         * 父 POI 的 ID
         * 当前 POI 如果有父 POI，则返回父 POI 的 ID。可能为空
         */
        @JsonDeserialize(using = StringOrArrayDeserializer.class)
        private String parent;

        /**
         * 名称
         */
        private String name;

        /**
         * 兴趣点类型
         * 顺序为大类、中类、小类
         * 例如：餐饮服务;中餐厅;特色/地方风味餐厅
         */
        private String type;

        /**
         * 兴趣点类型编码
         * 例如：050118
         */
        private String typecode;

        /**
         * 行业类型
         */
        private String biz_type;

        /**
         * 地址
         * 例如：东四环中路189号百盛北门
         */
        private String address;

        /**
         * 经纬度
         * 格式：X,Y
         */
        private String location;

        /**
         * 离中心点距离
         * 单位：米；仅在周边搜索的时候有值返回
         */
        @JsonDeserialize(using = StringOrArrayDeserializer.class)
        private String distance;

        /**
         * POI的电话
         */
        @JsonDeserialize(using = StringOrArrayDeserializer.class)
        private String tel;

        /**
         * 邮编
         * extensions=all时返回
         */
        private String postcode;

        /**
         * POI 的网址
         * extensions=all时返回
         */
        private String website;

        /**
         * POI 的电子邮箱
         * extensions=all时返回
         */
        private String email;

        /**
         * POI 所在省份编码
         * extensions=all时返回
         */
        private String pcode;

        /**
         * 城市编码
         * extensions=all 时返回
         */
        private String citycode;

        /**
         * 区域编码
         * extensions=all 时返回
         */
        private String adcode;

        /**
         * POI 的入口经纬度
         * extensions=all 时返回，也可用作于 POI 的到达点；
         */
        private String entr_location;

        /**
         * POI 的出口经纬度
         * 目前不会返回内容；
         */
        private String exit_location;

        /**
         * POI 导航 id
         * extensions=all 时返回
         */
        private String navi_poiid;

        /**
         * 地理格ID
         * extensions=all 时返回
         */
        private String gridcode;

        /**
         * 别名
         * extensions=all 时返回
         */
        private String alias;

        /**
         * 停车场类型
         * 仅在停车场类型 POI 的时候显示该字段
         * 展示停车场类型，包括：地下、地面、路边
         * extensions=all的时候显示
         */
        private String parking_type;

        /**
         * 该 POI 的特色内容
         * 主要出现在美食类 POI 中，代表特色菜
         * 例如"烤鱼,麻辣香锅,老干妈回锅肉"
         * extensions=all 时返回
         */
        private String tag;

        /**
         * 是否有室内地图标志
         * 1，表示有室内相关数据
         * 0，代表没有室内相关数据
         * extensions=all 时返回
         */
        private String indoor_map;

        /**
         * 室内地图相关数据
         * 当 indoor_map=0时，字段为空
         * extensions=all 时返回
         */
        private IndoorData indoor_data;

        /**
         * 当前 POI 的父级 POI
         * 如果当前 POI 为建筑物类 POI，则 cpid 为自身 POI ID；
         * 如果当前 POI 为商铺类 POI，则 cpid 为其所在建筑物的 POI ID
         */
        private String cpid;

        /**
         * 楼层索引
         * 一般会用数字表示，例如8
         */
        private String floor;

        /**
         * 所在楼层
         * 一般会带有字母，例如F8
         */
        private String truefloor;

        /**
         * 团购数据
         * 此字段逐渐废弃
         */
        private String groupbuy_num;

        /**
         * 所属商圈
         */
        private String business_area;

        /**
         * 优惠信息数目
         * 此字段逐渐废弃
         */
        private String discount_num;

        /**
         * 深度信息
         * extensions=all 时返回
         */
        @JsonDeserialize(using = StringOrArrayDeserializer.class)
        private String biz_ext;

        /**
         * 评分
         * 仅存在于餐饮、酒店、景点、影院类 POI 之下
         */
        private String rating;

        /**
         * 人均消费
         * 仅存在于餐饮、酒店、景点、影院类 POI 之下
         */
        private String cost;

        /**
         * 是否可订餐
         * 仅存在于餐饮相关 POI 之下（此字段逐渐废弃）
         */
        private String meal_ordering;

        /**
         * 是否可选座
         * 仅存在于影院相关 POI 之下（此字段逐渐废弃）
         */
        private String seat_ordering;

        /**
         * 是否可订票
         * 仅存在于景点相关 POI 之下（此字段逐渐废弃）
         */
        private String ticket_ordering;

        /**
         * 是否可以订房
         * 仅存在于酒店相关 POI 之下（此字段逐渐废弃）
         */
        private String hotel_ordering;

        /**
         * 照片相关信息
         * extensions=all 时返回
         */
        private List<Photo> photos;
    }

    /**
     * 照片信息
     */
    @Data
    public static class Photo {
        /**
         * 图片介绍
         */
        private String title;

        /**
         * 具体链接
         */
        private String url;
    }

    /**
     * 室内地图相关数据
     */
    @Data
    public static class IndoorData {
        /**
         * 楼层名称
         */
        private String cpid;

        /**
         * 楼层编号
         */
        private String floor;

        /**
         * 楼层列表
         */
        private List<Floor> floor_list;
    }

    /**
     * 楼层信息
     */
    @Data
    public static class Floor {
        /**
         * 楼层名称
         */
        private String name;

        /**
         * 楼层编号
         */
        private String floor_index;
    }

    /**
     * 建议结果
     */
    @Data
    public static class Suggestion {
        /**
         * 关键字建议
         */
        private List<String> keywords;

        /**
         * 城市建议列表
         * 当搜索的文本关键字在限定城市中没有返回时会返回建议城市列表；
         */
        private List<Cities> cities;
    }

    /**
     * 城市建议信息
     */
    @Data
    public static class Cities{
        /**
         * 名称
         */
        private String name;

        /**
         * 该城市包含此关键字的个数
         */
        private String num;

        /**
         * 该城市的 citycode
         */
        private String citycode;

        /**
         * 该城市的 adcode
         */
        private String adcode;
    }

}